<HTML>
<HEAD>
<!-- This HTML file has been created by texi2html 1.29
     from problems.tnf on 19 December 2010 -->

<TITLE>Solutions of common problems - Character String Arithmetic</TITLE>
</HEAD>
<BODY TEXT="#000000" BGCOLOR="#FFFFFF" LINK="#0000EE" VLINK="#551A8B" ALINK="#FF0000" BACKGROUND="gifs/bg.gif">
<TABLE BORDER=0 CELLSPACING=0 CELLPADDING=0" VALIGN=BOTTOM>
<TR VALIGN=BOTTOM>
<TD WIDTH="160" VALIGN=BOTTOM>
<A HREF="http://eli-project.sourceforge.net/">
<IMG SRC="gifs/elilogo.gif" BORDER=0>
</A>&nbsp;
</TD>
<TD WIDTH="25" VALIGN=BOTTOM>
<img src="gifs/empty.gif" WIDTH=25 HEIGHT=25>
</TD>
<TD ALIGN=LEFT WIDTH="475" VALIGN=BOTTOM>
<A HREF="index.html"><IMG SRC="gifs/title.png" BORDER=0></A>
</TD>
<!-- |DELETE FOR SOURCEFORGE LOGO|
<TD>
<a href="http://sourceforge.net/projects/eli-project">
<img
  src="http://sflogo.sourceforge.net/sflogo.php?group_id=70447&amp;type=13"
  width="120" height="30"
  alt="Get Eli: Translator Construction Made Easy at SourceForge.net.
    Fast, secure and Free Open Source software downloads"/>
</a>
</TD>
|DELETE FOR SOURCEFORGE LOGO| -->
</TR>
</TABLE>

<HR size=1 noshade width=785 align=left>
<TABLE BORDER=0 CELLSPACING=2 CELLPADDING=0>
<TR>
<TD VALIGN=TOP WIDTH="160">
<h4>General Information</h4>

<table BORDER=0 CELLSPACING=0 CELLPADDING=0>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="index.html">Eli: Translator Construction Made Easy</a></td></tr>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="gindex_1.html#SEC1">Global Index</a></td></tr>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="faq_toc.html" >Frequently Asked Questions</a> </td></tr>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="ee.html" >Typical Eli Usage Errors</a> </td></tr>
</table>

<h4>Tutorials</h4>

<table BORDER=0 CELLSPACING=0 CELLPADDING=0>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="EliRefCard_toc.html">Quick Reference Card</a></td></tr>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="novice_toc.html">Guide For new Eli Users</a></td></tr>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="news_toc.html">Release Notes of Eli</a></td></tr>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="nametutorial_toc.html">Tutorial on Name Analysis</a></td></tr>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="typetutorial_toc.html">Tutorial on Type Analysis</a></td></tr>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="ee.html" >Typical Eli Usage Errors</a> </td></tr>
</table>

<h4>Reference Manuals</h4>

<table BORDER=0 CELLSPACING=0 CELLPADDING=0>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="ui_toc.html">User Interface</a></td></tr>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="pp_toc.html">Eli products and parameters</a></td></tr>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="lidoref_toc.html">LIDO Reference Manual</a></td></tr>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="ee.html" >Typical Eli Usage Errors</a> </td></tr>
</table>

<h4>Libraries</h4>

<table BORDER=0 CELLSPACING=0 CELLPADDING=0>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="lib_toc.html">Eli library routines</a></td></tr>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="modlib_toc.html">Specification Module Library</a></td></tr>
</table>

<h4>Translation Tasks</h4>

<table BORDER=0 CELLSPACING=0 CELLPADDING=0>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="lex_toc.html">Lexical analysis specification</a></td></tr>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="syntax_toc.html">Syntactic Analysis Manual</a></td></tr>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="comptrees_toc.html">Computation in Trees</a></td></tr>
</table>

<h4>Tools</h4>

<table BORDER=0 CELLSPACING=0 CELLPADDING=0>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="lcl_toc.html">LIGA Control Language</a> </td></tr>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="show_toc.html">Debugging Information for LIDO</a> </td></tr>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="gorto_toc.html">Graphical ORder TOol</a> </td></tr>
</table>
<p>
<table BORDER=0 CELLSPACING=0 CELLPADDING=0>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="fw_toc.html">FunnelWeb User's Manual</a> </td></tr>
</table>
<p>
<table BORDER=0 CELLSPACING=0 CELLPADDING=0>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="ptg_toc.html">Pattern-based Text Generator</a> </td></tr>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="deftbl_toc.html">Property Definition Language</a> </td></tr>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="oil_toc.html">Operator Identification Language</a> </td></tr>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="tp_toc.html">Tree Grammar Specification Language</a> </td></tr>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="clp_toc.html">Command Line Processing</a> </td></tr>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="cola_toc.html">COLA Options Reference Manual</a> </td></tr>
</table>
<p>
<table BORDER=0 CELLSPACING=0 CELLPADDING=0>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="idem_toc.html">Generating Unparsing Code</a> </td></tr>
</table>
<p>
<table BORDER=0 CELLSPACING=0 CELLPADDING=0>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="mon_toc.html">Monitoring a Processor's Execution</a> </td></tr>
</table>

<h4>Administration</h4>

<table BORDER=0 CELLSPACING=0 CELLPADDING=0>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="sysadmin_toc.html">System Administration Guide</a> </td></tr>
</table>

<HR WIDTH="100%">
<A HREF="mailto:eli-project-users@lists.sourceforge.net">
<IMG SRC="gifs/button_mail.gif" BORDER=0 ALIGN="left"></A>
<A HREF="index.html"><IMG SRC="gifs/home.gif" BORDER=0 ALIGN="right"></A>

</TD>
<TD VALIGN=TOP WIDTH="25"><img src="gifs/empty.gif" WIDTH=25 HEIGHT=25></TD>

<TD VALIGN=TOP WIDTH="600">
<H1>Solutions of common problems</H1>
<P>
<IMG SRC="gifs/empty.gif" WIDTH=25 HEIGHT=25 ALT=""><A HREF="problems_6.html"><IMG SRC="gifs/prev.gif" ALT="Previous Chapter" BORDER="0"></A>
<IMG SRC="gifs/empty.gif" WIDTH=25 HEIGHT=25 ALT=""><A HREF="problems_8.html"><IMG SRC="gifs/next.gif" ALT="Next Chapter" BORDER="0"></A>
<IMG SRC="gifs/empty.gif" WIDTH=25 HEIGHT=25 ALT=""><A HREF="problems_toc.html"><IMG SRC="gifs/up.gif" ALT="Table of Contents" BORDER="0"></A>
<IMG SRC="gifs/empty.gif" WIDTH=25 HEIGHT=25 ALT="">
<HR size=1 noshade width=600 align=left>
<H1><A NAME="SEC7" HREF="problems_toc.html#SEC7">Character String Arithmetic</A></H1>
<A NAME="IDX32"></A>
<A NAME="IDX33"></A>
<A NAME="IDX34"></A>
<A NAME="IDX35"></A>
<P>
StrArith is a wrapper for the <CODE>strmath</CODE> library routines
(see  <A HREF="lib_1.html#SEC7">Character String Arithmetic of Library Reference Manual</A>).
It is instantiated by
<P>
<PRE>
   $/Tech/StrArith.gnrc +instance=NAME +referto=BASE :inst
</PRE>
where <CODE>NAME</CODE> is a prefix for the operator names and <CODE>BASE</CODE> is the
radix of the numbers to be manipulated.
If the <CODE>instance</CODE> parameter is omitted then the operator names have an
empty prefix; if the <CODE>referto</CODE> parameter is omitted then the radix is
10.
<P>
All operations exported by this module can be used in specifications of
type `.lido', `.init', and `.finl'.  They can also be used in C
modules if the interface file `NAMEStrArith.h' is imported there.
<P>
Strings representing numbers are all stored in the string table.
Their form is common in programming languages:
<P>
<PRE>
[+/-][d*][.][d*][e[+/-]d*]
</PRE>
Here <CODE>[]</CODE> indicate optional parts,
<CODE>+/-</CODE> indicates that a sign may be present,
<CODE>d</CODE> indicates digits in the chosen radix,
and <CODE>*</CODE> indicates repetition.
The optional dot separates the integer and fractional parts of a number,
and <CODE>e</CODE> stands for an exponent marker.
The actual characters used to represent digits, signs,
fractional separators and exponent symbols are determined by default or by
settings established by the <CODE>strmath</CODE> operation
(see  <A HREF="lib_1.html#SEC7">Character String Arithmetic of Library Reference Manual</A>).
<P>
An instantiation of <CODE>StrArith</CODE> with instance parameter <CODE>NAME</CODE>
provides the following operations:
<P>
<DL COMPACT>
<DT><CODE>int NAMEStrAdd(int left, int right)</CODE>
<DD><DT><CODE>int NAMEStrSub(int left, int right)</CODE>
<DD><DT><CODE>int NAMEStrMul(int left, int right)</CODE>
<DD><DT><CODE>int NAMEStrDiv(int left, int right)</CODE>
<DD><DT><CODE>int NAMEStrQuo(int left, int right)</CODE>
<DD><DT><CODE>int NAMEStrRem(int left, int right)</CODE>
<DD><DT><CODE>int NAMEStrExp(int left, int right)</CODE>
<DD>Dyadic arithmetic operations.
The two arguments are string table indices representing the left and right
operands.
The result is the string table index of a string representing the result.
<P>
<CODE>NAMEStrDiv</CODE> is a real division, possibly yielding a result with a
fractional part.
<CODE>NAMEStrQuo</CODE> yields the integer quotient from the division and
<CODE>NAMEStrRem</CODE> yields the integer remainder from the division.
<CODE>NAMEStrExp</CODE> raises the first operand to the power given by the second
operand.
<P>
<DT><CODE>int NAMEStrNeg(int opnd)</CODE>
<DD><DT><CODE>int NAMEStrSqrt(int opnd)</CODE>
<DD>Monadic arithmetic operations.
The argument is a string table index representing the operand.
The result is the string table index of a string representing the result.
<P>
<DT><CODE>int NAMEStrNorm(int opnd, int oldradix, int newradix, char *symbs)</CODE>
<DD>Normalizes a value, performing radix conversion if necessary.
The first argument is a string table index representing the operand.
The second and third arguments are the radix values for the conversion.
The result is the string table index of a string representing the result.
Its format depends on the content of the fourth argument:
<P>
<DL COMPACT>
<DT><CODE>symbs=0</CODE>
<DD>Whole number and fraction parts separated by the defined
fractional separator unless the result can be expressed as an
integral value, exponent marker and exponent if the length would
exceed <CODE>integer_size</CODE> digits.
<P>
<DT><CODE>symbs=""</CODE>
<DD>Sequence of digits if the length does not exceed <CODE>integer_size</CODE> digits,
otherwise the empty string (which is represented by string table index 0).
<P>
<DT><CODE>symbs=non-empty quoted string</CODE>
<DD>A fractional separator is guaranteed to appear in the result. 
The first character of the string is taken as the exponent marker. 
If there are additional characters in the string, then they will
be taken as the fractional separator, the minus sign, and the plus
sign respectively.
(The characters normally defined for these purposes will be used
if the corresponding character does not appear in the string.)
</DL>
</DL>
<P>
Here is a fragment of a specification for a calculator that uses
<CODE>StrArith</CODE> to implement the arithmetic:
<P>
<PRE>
ATTR val: int;

RULE: Program ::= Expr COMPUTE
  printf("%s\n", StringTable(Expr.val));
END;

RULE: Expr ::= Expr '+' Expr COMPUTE
  Expr[1].val=StrAdd(Expr[2].val,Expr[3].val);
END;

...

RULE: Expr ::= '-' Expr COMPUTE
  Expr[1].val=StrNeg(Expr[2].val);
END;

RULE: Expr ::= 'sqrt' '(' Expr ')' COMPUTE
  Expr[1].val=StrSqrt(Expr[2].val);
END;

RULE: Expr ::= Constant COMPUTE
  Expr.val=Constant;
END;
</PRE>
<P>
<CODE>StrArith</CODE> was instantiated without parameters for this example:
<P>
<PRE>
$/Tech/StrArith.gnrc :inst
</PRE>
<P>
<HR size=1 noshade width=600 align=left>
<P>
<IMG SRC="gifs/empty.gif" WIDTH=25 HEIGHT=25 ALT=""><A HREF="problems_6.html"><IMG SRC="gifs/prev.gif" ALT="Previous Chapter" BORDER="0"></A>
<IMG SRC="gifs/empty.gif" WIDTH=25 HEIGHT=25 ALT=""><A HREF="problems_8.html"><IMG SRC="gifs/next.gif" ALT="Next Chapter" BORDER="0"></A>
<IMG SRC="gifs/empty.gif" WIDTH=25 HEIGHT=25 ALT=""><A HREF="problems_toc.html"><IMG SRC="gifs/up.gif" ALT="Table of Contents" BORDER="0"></A>
<IMG SRC="gifs/empty.gif" WIDTH=25 HEIGHT=25 ALT="">
<HR size=1 noshade width=600 align=left>
</TD>
</TR>
</TABLE>

</BODY></HTML>
